/*
专用于测试C语言的一些语法等内容
*/
#include "common.h"

#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common_test.h"

static int case_default_break(int mod){
    /*
    此处说明default中包含break在case中的位置就无所谓了，在前或在后一样
    两个case写一起，相当于两种情况走同样的处理逻辑
    没有break的情况，会直接走两个逻辑

    大胆猜测，如果default没有break,后执行2 ,请自己去验证吧
    */
    int result=0;
    switch(mod){
        case 1:
            result=1;
            break;
        default:
            result=100;
            break;
        case 2:
            result=2;
            break;
        case 3:
        case 4:
            result=3;
            break;
        case 5:
            result=5;
        case 6:
            result=6;
            break;
    }
    return result;
}

static void test_switch_case(void){
    int ret=0;
    assert(1 == case_default_break(1));
    assert(2 == case_default_break(2));
    assert(3 == case_default_break(3));
    assert(4 == case_default_break(3));
    assert(5 == case_default_break(6));
    assert(6 == case_default_break(6));
    assert(100 == case_default_break(-6));       
}

static void test_plus_plus(void){
    TEST_START_INFO;

    TEST_LINE_REPORT_START;

    // NULL 在 逻辑判断中代表false
    assert(!NULL);

    /*
    i++ ++i效率比较详解
    https://blog.csdn.net/LxXlc468hW35lZn5/article/details/125240637
    */
    int i,j,c;
    i=j=0;

    c=i++;
    c=++j;
    assert(0 != c);
    TEST_END_INFO;
}

static void test_sizeof_strlen(void){
    char * test = "emulator-";
    // 下面的句子中，常量字符串做为数组，长度是实际字符数+1，编译器多加一个 \0 
    // 所以在函数中使用时要用 下面的写法，只比较实际的字符数
    int len = sizeof("emulator-") - 1;
    assert(9 == len);

    int str_len = strlen(test);
    assert(9 == str_len);

    // 下面的两句获取的值与具体的平台有关，64位平台ubuntu20.04都是8
    int char_point_len = sizeof(test);
    int array_len = ARRAY_LEN(test);
    
    printf("%d",array_len);
    assert(8 == char_point_len);
    assert(8 == array_len);
}

static void test_bool_code(void){
    /* 验证数字与布尔类型的转换
     * 在C语言中，逻辑值“真”用数字1表示，逻辑值“假”是用数字0表示。在c语言中，任何非0数字都能够被系统解释为“逻辑真”
     * */
    int i = 0;

    TEST_START_INFO;

    TEST_LINE_REPORT_START;
    printf("assert(!i) is ok! -> i= %d\n",i);

    // assert的作用是现计算表达式 expression ，如果其值为假（即为0），那么它先向stderr打印一条出错信息，
    // 然后通过调用 abort 来终止程序运行
    assert(!i);

    i = 1;
    assert(i);
    printf("assert(i) is ok! -> i= %d\n",i);

    i = 2;
    assert(i);
    printf("assert(i) is ok! -> i= %d\n",i);

    i=-2;
    assert(i);

    TEST_END_INFO;
}


int main(int argc, char *argv[]) {
    (void) argc;
    (void) argv;

    test_plus_plus();
    test_sizeof_strlen();
    test_bool_code();

    return 0;
};